{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {
    "_cell_guid": "4d5be342-abe9-4c95-98fd-c904762ecca9",
    "_uuid": "47570c242f4774c5d670093b822cf6a3f3a91ba9"
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import classification_report, f1_score, precision_score, recall_score\n",
    "from sklearn.utils import class_weight\n",
    "\n",
    "import tensorflow as tf\n",
    "\n",
    "from keras import layers\n",
    "from keras.preprocessing.sequence import pad_sequences\n",
    "from keras.models import Model, Sequential, Input\n",
    "import keras\n",
    "\n",
    "from keras_contrib.layers import CRF\n",
    "from keras_contrib.losses import crf_loss\n",
    "from keras_contrib.metrics import crf_accuracy\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "\n",
    "import pygal\n",
    "import json\n",
    "\n",
    "gpus = tf.config.experimental.list_physical_devices(device_type='GPU')\n",
    "for gpu in gpus:\n",
    "    tf.config.experimental.set_memory_growth(gpu, True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.read_csv('data.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>text</th>\n",
       "      <th>label</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>广</td>\n",
       "      <td>B_ORG</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>西</td>\n",
       "      <td>I_ORG</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>壮</td>\n",
       "      <td>I_ORG</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>族</td>\n",
       "      <td>I_ORG</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>自</td>\n",
       "      <td>I_ORG</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>200749</th>\n",
       "      <td>公</td>\n",
       "      <td>O</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>200750</th>\n",
       "      <td>开</td>\n",
       "      <td>O</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>200751</th>\n",
       "      <td>发</td>\n",
       "      <td>O</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>200752</th>\n",
       "      <td>布</td>\n",
       "      <td>O</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>200753</th>\n",
       "      <td>）</td>\n",
       "      <td>O</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>200754 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "       text  label\n",
       "0         广  B_ORG\n",
       "1         西  I_ORG\n",
       "2         壮  I_ORG\n",
       "3         族  I_ORG\n",
       "4         自  I_ORG\n",
       "...     ...    ...\n",
       "200749    公      O\n",
       "200750    开      O\n",
       "200751    发      O\n",
       "200752    布      O\n",
       "200753    ）      O\n",
       "\n",
       "[200754 rows x 2 columns]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "WORD_NUM = 60"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# print(df.shape)\n",
    "# df = df[df['label'].map(lambda x: x.replace(' ', '') not in ['O', 'OO', '0'])]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "text_list = df[df['text'] == '。'].index.tolist()\n",
    "text_list = list(map(lambda x: x + 1, text_list))\n",
    "text_list.insert(0, 0)\n",
    "\n",
    "x = []\n",
    "y = []\n",
    "\n",
    "for m in range(len(text_list)):\n",
    "    if m == 0:\n",
    "        x.append(list(''.join(map(str, df.iloc[:text_list[m + 1], 0].tolist()))))\n",
    "        y.append(df.iloc[:text_list[m + 1], 1].tolist())\n",
    "    elif m == len(text_list) - 1:\n",
    "        continue\n",
    "    else:\n",
    "        x.append(list(''.join(map(str, df.iloc[text_list[m]: text_list[m + 1], 0].tolist()))))\n",
    "        y.append(df.iloc[text_list[m]: text_list[m + 1], 1].tolist())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "scrolled": true,
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['广',\n",
       " '西',\n",
       " '壮',\n",
       " '族',\n",
       " '自',\n",
       " '治',\n",
       " '区',\n",
       " '人',\n",
       " '民',\n",
       " '政',\n",
       " '府',\n",
       " '关',\n",
       " '于',\n",
       " '同',\n",
       " '意',\n",
       " '广',\n",
       " '西',\n",
       " '那',\n",
       " '林',\n",
       " '自',\n",
       " '治',\n",
       " '区',\n",
       " '级',\n",
       " '自',\n",
       " '然',\n",
       " '保',\n",
       " '护',\n",
       " '区',\n",
       " '面',\n",
       " '积',\n",
       " '和',\n",
       " '界',\n",
       " '线',\n",
       " '确',\n",
       " '定',\n",
       " '方',\n",
       " '案',\n",
       " '的',\n",
       " '批',\n",
       " '复',\n",
       " '(',\n",
       " '桂',\n",
       " '政',\n",
       " '函',\n",
       " '〔',\n",
       " '2',\n",
       " '0',\n",
       " '1',\n",
       " '9',\n",
       " '〕',\n",
       " '5',\n",
       " '3',\n",
       " '号',\n",
       " ')',\n",
       " '自',\n",
       " '治',\n",
       " '区',\n",
       " '林',\n",
       " '业',\n",
       " '局',\n",
       " '：',\n",
       " '你',\n",
       " '局',\n",
       " '（',\n",
       " '原',\n",
       " '自',\n",
       " '治',\n",
       " '区',\n",
       " '林',\n",
       " '业',\n",
       " '厅',\n",
       " '）',\n",
       " '关',\n",
       " '于',\n",
       " '广',\n",
       " '西',\n",
       " '那',\n",
       " '林',\n",
       " '自',\n",
       " '治',\n",
       " '区',\n",
       " '级',\n",
       " '自',\n",
       " '然',\n",
       " '保',\n",
       " '护',\n",
       " '区',\n",
       " '面',\n",
       " '积',\n",
       " '和',\n",
       " '界',\n",
       " '线',\n",
       " '确',\n",
       " '定',\n",
       " '方',\n",
       " '案',\n",
       " '的',\n",
       " '请',\n",
       " '示',\n",
       " '收',\n",
       " '悉',\n",
       " '。']"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "scrolled": true,
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['B_ORG',\n",
       " 'I_ORG',\n",
       " 'I_ORG',\n",
       " 'I_ORG',\n",
       " 'I_ORG',\n",
       " 'I_ORG',\n",
       " 'I_ORG',\n",
       " 'I_ORG',\n",
       " 'I_ORG',\n",
       " 'I_ORG',\n",
       " 'I_ORG',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'B_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'B_T',\n",
       " 'I_T',\n",
       " 'I_T',\n",
       " 'I_T',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'B_ORG',\n",
       " 'I_ORG',\n",
       " 'I_ORG',\n",
       " 'I_ORG',\n",
       " 'I_ORG',\n",
       " 'I_ORG',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'B_ORG',\n",
       " 'I_ORG',\n",
       " 'I_ORG',\n",
       " 'I_ORG',\n",
       " 'I_ORG',\n",
       " 'I_ORG',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'B_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O']"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "# for m, n in enumerate(x):\n",
    "#     if len(n) == 0:\n",
    "#         print(m)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "del x[1402]\n",
    "del y[1402]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1723"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "count    1723.000000\n",
       "mean      116.366802\n",
       "std       361.007044\n",
       "min         6.000000\n",
       "25%        30.000000\n",
       "50%        54.000000\n",
       "75%        98.000000\n",
       "max      8639.000000\n",
       "dtype: float64"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.Series([len(i) for i in x]).describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "remove_list = []\n",
    "for m, n in enumerate(x):\n",
    "    if len(n) > 300:\n",
    "        remove_list.append(m)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = [n for m, n in enumerate(x) if m not in remove_list]\n",
    "y = [n for m, n in enumerate(y) if m not in remove_list]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1639"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "count    1639.000000\n",
       "mean       65.527151\n",
       "std        50.569338\n",
       "min         6.000000\n",
       "25%        29.000000\n",
       "50%        51.000000\n",
       "75%        87.000000\n",
       "max       299.000000\n",
       "dtype: float64"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.Series([len(i) for i in x]).describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "def create(i):\n",
    "    global num\n",
    "    temp = []\n",
    "    \n",
    "    for g in i:\n",
    "        try:\n",
    "            corpus[g]\n",
    "            temp.append(corpus[g])\n",
    "        except:\n",
    "            corpus[g] = num\n",
    "            temp.append(corpus[g])\n",
    "            num += 1\n",
    "    return temp"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "corpus = {}\n",
    "corpus['<PAD>'] = 0\n",
    "corpus['<UNK>'] = 1\n",
    "\n",
    "num = 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "text = []\n",
    "for i in x:\n",
    "    temp = create(i)\n",
    "    text.append(temp)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "scrolled": true,
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[2,\n",
       " 3,\n",
       " 4,\n",
       " 5,\n",
       " 6,\n",
       " 7,\n",
       " 8,\n",
       " 9,\n",
       " 10,\n",
       " 11,\n",
       " 12,\n",
       " 13,\n",
       " 14,\n",
       " 15,\n",
       " 16,\n",
       " 2,\n",
       " 3,\n",
       " 17,\n",
       " 18,\n",
       " 6,\n",
       " 7,\n",
       " 8,\n",
       " 19,\n",
       " 6,\n",
       " 20,\n",
       " 21,\n",
       " 22,\n",
       " 8,\n",
       " 23,\n",
       " 24,\n",
       " 25,\n",
       " 26,\n",
       " 27,\n",
       " 28,\n",
       " 29,\n",
       " 30,\n",
       " 31,\n",
       " 32,\n",
       " 33,\n",
       " 34,\n",
       " 35,\n",
       " 36,\n",
       " 11,\n",
       " 37,\n",
       " 38,\n",
       " 39,\n",
       " 40,\n",
       " 41,\n",
       " 42,\n",
       " 43,\n",
       " 44,\n",
       " 45,\n",
       " 46,\n",
       " 47,\n",
       " 6,\n",
       " 7,\n",
       " 8,\n",
       " 18,\n",
       " 48,\n",
       " 49,\n",
       " 50,\n",
       " 51,\n",
       " 49,\n",
       " 52,\n",
       " 53,\n",
       " 6,\n",
       " 7,\n",
       " 8,\n",
       " 18,\n",
       " 48,\n",
       " 54,\n",
       " 55,\n",
       " 13,\n",
       " 14,\n",
       " 2,\n",
       " 3,\n",
       " 17,\n",
       " 18,\n",
       " 6,\n",
       " 7,\n",
       " 8,\n",
       " 19,\n",
       " 6,\n",
       " 20,\n",
       " 21,\n",
       " 22,\n",
       " 8,\n",
       " 23,\n",
       " 24,\n",
       " 25,\n",
       " 26,\n",
       " 27,\n",
       " 28,\n",
       " 29,\n",
       " 30,\n",
       " 31,\n",
       " 32,\n",
       " 56,\n",
       " 57,\n",
       " 58,\n",
       " 59,\n",
       " 60]"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "text[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "text = pad_sequences(text, maxlen=WORD_NUM, padding='post', truncating='post', value=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "scrolled": true,
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,  2,  3,\n",
       "       17, 18,  6,  7,  8, 19,  6, 20, 21, 22,  8, 23, 24, 25, 26, 27, 28,\n",
       "       29, 30, 31, 32, 33, 34, 35, 36, 11, 37, 38, 39, 40, 41, 42, 43, 44,\n",
       "       45, 46, 47,  6,  7,  8, 18, 48, 49])"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "text[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "label = []\n",
    "for i in y:\n",
    "    label += i"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "targ = {\n",
    "    'O': 0,\n",
    "    'B_LOC': 1, 'I_LOC': 2,\n",
    "    'B_ORG': 3, 'I_ORG': 4,\n",
    "    'B_PRO': 5, 'I_PRO': 6,\n",
    "    'B_T': 7, 'I_T': 8\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'O': 0,\n",
       " 'B_LOC': 1,\n",
       " 'I_LOC': 2,\n",
       " 'B_ORG': 3,\n",
       " 'I_ORG': 4,\n",
       " 'B_PRO': 5,\n",
       " 'I_PRO': 6,\n",
       " 'B_T': 7,\n",
       " 'I_T': 8}"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "targ"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "def create_label(i):\n",
    "    temp = []\n",
    "    \n",
    "    for g in i:\n",
    "        temp.append(targ[g])\n",
    "    return temp"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "label = []\n",
    "for i in y:\n",
    "    temp = create_label(i)\n",
    "    label.append(temp)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "label = pad_sequences(label, maxlen=WORD_NUM, padding='post', truncating='post', value=targ['O'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1639, 60)"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "label.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2,\n",
       "       2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
       "       0, 7, 8, 8, 8, 0, 0, 0, 0, 0, 3, 4, 4, 4, 4, 4])"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "label[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "remove_list = []\n",
    "for m, n in enumerate(label):\n",
    "    if len(set(n)) == 1 and set(n) == {0}:\n",
    "        remove_list.append(m)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [],
   "source": [
    "text = np.array([n for m, n in enumerate(text) if m not in remove_list])\n",
    "label = np.array([n for m, n in enumerate(label) if m not in remove_list])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [],
   "source": [
    "embedding_len = len(corpus)\n",
    "n_tag = 9\n",
    "\n",
    "embedding_size = 200\n",
    "lstm_units = 128"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "_uuid": "ed0bec01d5f74324d79d75e1890fa4819f1acc98"
   },
   "outputs": [],
   "source": [
    "x_train, x_test, y_train, y_test = train_test_split(text, label.reshape(label.shape[0], label.shape[1], 1), test_size=0.2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((667, 60), (667, 60, 1))"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x_train.shape, y_train.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((167, 60), (167, 60, 1))"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x_test.shape, y_test.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.15481859,  7.17419355,  1.99354607,  6.19153675,  1.00198234,\n",
       "       29.89247312,  2.37201365, 23.65957447,  4.11547002])"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "class_weight = class_weight.compute_class_weight(class_weight='balanced', classes=np.unique(label.flatten()), y=label.flatten())\n",
    "class_weight"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "_uuid": "2fa113078dde42fb187ec5f7216e6a2f8717c622",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"model_1\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "input_1 (InputLayer)         (None, 60)                0         \n",
      "_________________________________________________________________\n",
      "embedding_1 (Embedding)      (None, 60, 200)           311800    \n",
      "_________________________________________________________________\n",
      "bidirectional_1 (Bidirection (None, 60, 400)           641600    \n",
      "_________________________________________________________________\n",
      "time_distributed_1 (TimeDist (None, 60, 9)             3609      \n",
      "_________________________________________________________________\n",
      "crf_1 (CRF)                  (None, 60, 9)             189       \n",
      "=================================================================\n",
      "Total params: 957,198\n",
      "Trainable params: 957,198\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "inp = layers.Input(shape=(WORD_NUM, ))\n",
    "x = layers.Embedding(embedding_len, embedding_size, input_length=WORD_NUM)(inp)\n",
    "x = layers.Bidirectional(layers.LSTM(embedding_size, return_sequences=True))(x)\n",
    "\n",
    "x = layers.TimeDistributed(layers.Dense(n_tag, activation=\"relu\"))(x)\n",
    "x = CRF(n_tag, sparse_target=True)(x)\n",
    "\n",
    "model = Model(inputs=inp, outputs=x)\n",
    "\n",
    "model.compile(loss=crf_loss,\n",
    "              optimizer='adam',\n",
    "              metrics=[crf_accuracy])\n",
    "\n",
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "_uuid": "124306348431764ee32027ab77412f1b3abf05bd",
    "scrolled": true,
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\anaconda3\\envs\\test\\lib\\site-packages\\tensorflow\\python\\framework\\indexed_slices.py:434: UserWarning: Converting sparse IndexedSlices to a dense Tensor of unknown shape. This may consume a large amount of memory.\n",
      "  \"Converting sparse IndexedSlices to a dense Tensor of unknown shape. \"\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 600 samples, validate on 67 samples\n",
      "Epoch 1/30\n",
      "600/600 [==============================] - 5s 9ms/step - loss: 1.9182 - crf_accuracy: 0.3409 - val_loss: 1.1964 - val_crf_accuracy: 0.8264\n",
      "Epoch 2/30\n",
      "600/600 [==============================] - 4s 6ms/step - loss: 1.1702 - crf_accuracy: 0.7139 - val_loss: 0.8788 - val_crf_accuracy: 0.8264\n",
      "Epoch 3/30\n",
      "600/600 [==============================] - 4s 6ms/step - loss: 1.0195 - crf_accuracy: 0.7145 - val_loss: 0.7930 - val_crf_accuracy: 0.8292\n",
      "Epoch 4/30\n",
      "600/600 [==============================] - 4s 6ms/step - loss: 0.9256 - crf_accuracy: 0.7187 - val_loss: 0.7285 - val_crf_accuracy: 0.8339\n",
      "Epoch 5/30\n",
      "600/600 [==============================] - 4s 6ms/step - loss: 0.8467 - crf_accuracy: 0.7431 - val_loss: 0.6514 - val_crf_accuracy: 0.8440\n",
      "Epoch 6/30\n",
      "600/600 [==============================] - 4s 6ms/step - loss: 0.7573 - crf_accuracy: 0.7602 - val_loss: 0.5872 - val_crf_accuracy: 0.8547\n",
      "Epoch 7/30\n",
      "600/600 [==============================] - 4s 6ms/step - loss: 0.6762 - crf_accuracy: 0.7850 - val_loss: 0.5335 - val_crf_accuracy: 0.8817\n",
      "Epoch 8/30\n",
      "600/600 [==============================] - 4s 7ms/step - loss: 0.6078 - crf_accuracy: 0.7965 - val_loss: 0.4815 - val_crf_accuracy: 0.8931\n",
      "Epoch 9/30\n",
      "600/600 [==============================] - 4s 6ms/step - loss: 0.5425 - crf_accuracy: 0.8163 - val_loss: 0.4362 - val_crf_accuracy: 0.9075\n",
      "Epoch 10/30\n",
      "600/600 [==============================] - 4s 6ms/step - loss: 0.4843 - crf_accuracy: 0.8429 - val_loss: 0.4019 - val_crf_accuracy: 0.9131\n",
      "Epoch 11/30\n",
      "600/600 [==============================] - 4s 7ms/step - loss: 0.4375 - crf_accuracy: 0.8566 - val_loss: 0.4039 - val_crf_accuracy: 0.9099\n",
      "Epoch 12/30\n",
      "600/600 [==============================] - 4s 6ms/step - loss: 0.3869 - crf_accuracy: 0.8742 - val_loss: 0.3659 - val_crf_accuracy: 0.9055\n",
      "Epoch 13/30\n",
      "600/600 [==============================] - 4s 6ms/step - loss: 0.3467 - crf_accuracy: 0.8942 - val_loss: 0.3258 - val_crf_accuracy: 0.9317\n",
      "Epoch 14/30\n",
      "600/600 [==============================] - 4s 6ms/step - loss: 0.2963 - crf_accuracy: 0.9191 - val_loss: 0.3052 - val_crf_accuracy: 0.9323\n",
      "Epoch 15/30\n",
      "600/600 [==============================] - 4s 6ms/step - loss: 0.2569 - crf_accuracy: 0.9273 - val_loss: 0.3086 - val_crf_accuracy: 0.9214\n",
      "Epoch 16/30\n",
      "600/600 [==============================] - 4s 6ms/step - loss: 0.2424 - crf_accuracy: 0.9277 - val_loss: 0.2862 - val_crf_accuracy: 0.9313\n",
      "Epoch 17/30\n",
      "600/600 [==============================] - 4s 6ms/step - loss: 0.2126 - crf_accuracy: 0.9379 - val_loss: 0.2777 - val_crf_accuracy: 0.9440\n",
      "Epoch 18/30\n",
      "600/600 [==============================] - 4s 6ms/step - loss: 0.1961 - crf_accuracy: 0.9419 - val_loss: 0.2650 - val_crf_accuracy: 0.9314\n",
      "Epoch 19/30\n",
      "600/600 [==============================] - 4s 6ms/step - loss: 0.1786 - crf_accuracy: 0.9472 - val_loss: 0.2708 - val_crf_accuracy: 0.9442\n",
      "Epoch 20/30\n",
      "600/600 [==============================] - 4s 6ms/step - loss: 0.1561 - crf_accuracy: 0.9547 - val_loss: 0.2534 - val_crf_accuracy: 0.9288\n",
      "Epoch 21/30\n",
      "600/600 [==============================] - 4s 6ms/step - loss: 0.1413 - crf_accuracy: 0.9591 - val_loss: 0.2431 - val_crf_accuracy: 0.9377\n",
      "Epoch 22/30\n",
      "600/600 [==============================] - 4s 6ms/step - loss: 0.1260 - crf_accuracy: 0.9634 - val_loss: 0.2430 - val_crf_accuracy: 0.9477\n",
      "Epoch 23/30\n",
      "600/600 [==============================] - 4s 6ms/step - loss: 0.1124 - crf_accuracy: 0.9706 - val_loss: 0.2416 - val_crf_accuracy: 0.9476\n",
      "Epoch 24/30\n",
      "600/600 [==============================] - 4s 6ms/step - loss: 0.1013 - crf_accuracy: 0.9733 - val_loss: 0.2420 - val_crf_accuracy: 0.9493\n",
      "Epoch 25/30\n",
      "600/600 [==============================] - 4s 6ms/step - loss: 0.0935 - crf_accuracy: 0.9758 - val_loss: 0.2345 - val_crf_accuracy: 0.9412\n",
      "Epoch 26/30\n",
      "600/600 [==============================] - 4s 6ms/step - loss: 0.0891 - crf_accuracy: 0.9779 - val_loss: 0.2415 - val_crf_accuracy: 0.9347\n",
      "Epoch 27/30\n",
      "600/600 [==============================] - 4s 6ms/step - loss: 0.0846 - crf_accuracy: 0.9778 - val_loss: 0.2283 - val_crf_accuracy: 0.9447\n",
      "Epoch 28/30\n",
      "600/600 [==============================] - 4s 6ms/step - loss: 0.0807 - crf_accuracy: 0.9796 - val_loss: 0.2824 - val_crf_accuracy: 0.9468\n",
      "Epoch 29/30\n",
      "600/600 [==============================] - 4s 6ms/step - loss: 0.0797 - crf_accuracy: 0.9787 - val_loss: 0.2367 - val_crf_accuracy: 0.9460\n",
      "Epoch 30/30\n",
      "600/600 [==============================] - 4s 6ms/step - loss: 0.0685 - crf_accuracy: 0.9833 - val_loss: 0.2445 - val_crf_accuracy: 0.9471\n"
     ]
    }
   ],
   "source": [
    "# history = model.fit(x_train, y_train, batch_size=256, epochs=30, validation_split=0.1, class_weight=class_weight)\n",
    "history = model.fit(x_train, y_train, batch_size=64, epochs=30, validation_split=0.1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x181d5302d08>"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 800x640 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(10, 8), dpi=80)\n",
    "plt.plot(history.history['loss'], label='loss')\n",
    "plt.plot(history.history['val_loss'], label='val_loss')\n",
    "plt.title('Loss')\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'Acc')"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 800x640 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(10, 8), dpi=80)\n",
    "plt.plot(history.history['crf_accuracy'], label='train')\n",
    "plt.plot(history.history['val_crf_accuracy'], label='val')\n",
    "plt.legend()\n",
    "plt.title('Acc')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "_uuid": "d69d4e8d2a544352418b1fc7144c6162d05823c5"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "167/167 [==============================] - 0s 3ms/step\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[0.309038907111048, 0.9325768947601318]"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.evaluate(x_test, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [],
   "source": [
    "pre = np.argmax(model.predict(text), axis=-1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [],
   "source": [
    "target_names = ['O', 'B_LOC', 'I_LOC', 'B_ORG', 'I_ORG', 'B_PRO', 'I_PRO', 'B_T', 'I_T']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "           O       0.98      0.99      0.98     35913\n",
      "       B_LOC       0.90      0.86      0.88       775\n",
      "       I_LOC       0.94      0.89      0.92      2789\n",
      "       B_ORG       0.94      0.92      0.93       898\n",
      "       I_ORG       0.96      0.96      0.96      5549\n",
      "       B_PRO       0.99      0.88      0.93       186\n",
      "       I_PRO       0.97      0.93      0.95      2344\n",
      "         B_T       0.89      0.79      0.84       235\n",
      "         I_T       0.97      0.96      0.97      1351\n",
      "\n",
      "    accuracy                           0.97     50040\n",
      "   macro avg       0.95      0.91      0.93     50040\n",
      "weighted avg       0.97      0.97      0.97     50040\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print(classification_report(label.flatten(), pre.flatten(), target_names=target_names, zero_division=0))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [],
   "source": [
    "r_s = recall_score(label.flatten(), pre.flatten(), average=None)\n",
    "p_s = precision_score(label.flatten(), pre.flatten(), average=None)\n",
    "f_s = f1_score(label.flatten(), pre.flatten(), average=None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [],
   "source": [
    "radar_chart = pygal.Radar(fill=True, range=(0, 1))\n",
    "\n",
    "radar_chart.title = '指标可视化'\n",
    "radar_chart.x_labels = target_names\n",
    "\n",
    "radar_chart.add('Recall', r_s)\n",
    "radar_chart.add('Precision', p_s)\n",
    "radar_chart.add('F1', f_s)\n",
    " \n",
    "radar_chart.render_to_file('result.svg')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,  2,  3,\n",
       "       17, 18,  6,  7,  8, 19,  6, 20, 21, 22,  8, 23, 24, 25, 26, 27, 28,\n",
       "       29, 30, 31, 32, 33, 34, 35, 36, 11, 37, 38, 39, 40, 41, 42, 43, 44,\n",
       "       45, 46, 47,  6,  7,  8, 18, 48, 49])"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "text[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2,\n",
       "       0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
       "       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 4, 4, 4, 4], dtype=int64)"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pre[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2,\n",
       "       2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
       "       0, 7, 8, 8, 8, 0, 0, 0, 0, 0, 3, 4, 4, 4, 4, 4])"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "label[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'O': 0,\n",
       " 'B_LOC': 1,\n",
       " 'I_LOC': 2,\n",
       " 'B_ORG': 3,\n",
       " 'I_ORG': 4,\n",
       " 'B_PRO': 5,\n",
       " 'I_PRO': 6,\n",
       " 'B_T': 7,\n",
       " 'I_T': 8}"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "targ"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [],
   "source": [
    "def invert_dict(d):\n",
    "    return dict([(v, k) for (k, v) in d.items()])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{0: 'O',\n",
       " 1: 'B_LOC',\n",
       " 2: 'I_LOC',\n",
       " 3: 'B_ORG',\n",
       " 4: 'I_ORG',\n",
       " 5: 'B_PRO',\n",
       " 6: 'I_PRO',\n",
       " 7: 'B_T',\n",
       " 8: 'I_T'}"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "targ_idx = invert_dict(targ)\n",
    "targ_idx"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [],
   "source": [
    "# model.save_weights('model.h5')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [],
   "source": [
    "with open('dictionary.json', 'w', encoding='utf8') as f:\n",
    "    json.dump(corpus, f, ensure_ascii=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "_uuid": "ef881bb13b0dba32d5512df837b6322fe5d9ca99"
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
